const { resolve } = require('path');
var send = require('./send');
/**
 * 静态文件目录，用于返回对应资源，这种的话，不能我随便加个不存在的 static 路径，最终指向 public
 * @param {*} root 路径地址
 * @param {*} opts 配置项
 */
function serve(root, opts) {
    //就算 opts 为null/undefined ，也不会报错的
    opts = Object.assign(Object.create(null), opts);
    opts.root = resolve(root);
    console.log('opts.root:');
    console.log(opts.root);
    //设定首页
    if (opts.index) opts.index = opts.index || 'index.html';

    return async function serve(ctx, next) {
        //用于标记是否成功返回
        let done = false;
        //仅响应 head 和 get 请求(一会儿写通了试一下)
        let {method} = ctx;
        if(method==='HEAD' || method==='GET'){
            try{
                console.log('static 中间件开始获取文件内容了');
                done = await send(ctx, ctx.path, opts); 
                console.log('获取到了文件内容: '+done);
                if(done===true) await next();
            }catch(err){
                //找不到页面这类错误不抛出，koa 自身会处理
                console.log('static 中间件出错了');
                if(err.status!==404){
                    console.log('static 中间件出了非 404 错误');
                    throw err;
                }
            }
        }

        //如果没成功，交给后续中间件处理，如果成功了，请求到此为止，不再需要向下(koa-static 考虑的挺多);
        if(!done){
            console.log('static 中间件失败了')
            await next();
        }
    }
}
module.exports = serve;